#define  _CRT_SECURE_NO_WARNINGS 1
//#include"head.h"

//1、字符指针变量
//int main()
//{
//	char ch = 'w';
//    char *p = &ch;
//    printf("%c\n", *p);
//
//	return 0;
//}

//int main()
//{
//	const char* p = "abcdef";//"abcdef"是一个常量字符串，在内存只读数据区。
//	//首字符地址交给p，p指向字符串，可以看作数组
//
//	printf("%s\n", p);//不是*p
//	/*
//	printf 函数中，%s 用于输出字符串，它的工作原理是：
//	从指定的内存地址开始，依次读取字符并输出，直到遇到字符串结束标志 '\0' 为止。
//	因此，%s 要求对应的参数必须是字符串的首地址（即指向字符串第一个字符的指针），而不是单个字符。
//	printf("%s\n", str1);
//	*/
//
//	return 0;
//}


//int main()
//{
//	char str1[] = "hello world.";
//	char str2[] = "hello world.";
//	//两个不同的数组，首元素地址不一样
//
//	const char* str3 = "hello world.";
//	const char* str4 = "hello world.";
//    //两个常量字符串，首元素地址一样。两个独立的指针变量指向同一个地址
//	//常量字符串的内容不能修改，相同的常量字符串只存一份。
//
//	if (str1 == str2)
//	{
//		printf("str1 == str2\n");
//	}
//	else
//	{
//		printf("str1 != str2\n");
//	}
//
//	if (str3 == str4)
//	{
//		printf("str3 == str4\n");
//	}
//	else
//	{
//		printf("str3 != str4\n");
//	}
//
//	if (str1[1] == str2[1])
//	{
//		printf("str1[1] == str2[1]\n");
//	}
//	else
//	{
//		printf("str1[1] != str2[1]\n");
//	}
//
//
//	return 0;
//}


//int main()
//{
//	const char* p = "abcdef";
//	printf("%s\n", p);
//
//	while (*p != '\0')
//	{
//        printf("%c", *p);
//        p++;
//	}
//
//	return 0;
//}




//2、数组指针变量-->指向数组

//int main()
//{
//	int arr[5] = { 1,2,3,4,5 };
//    int(*p)[5] = &arr;//数组指针变量，存放数组地址，能够指向数组
//	//int(*)[5] -->数组指针变量的类型
//	//指向数组元素的类型(*数组指针名)[指向数组的元素个数]
// 
//	//int* p[5]-->存放指针的数组，而不是数组指针变量
//
//	char str[6];
//	char(*pc)[6] = &str;
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//    int* p1 = arr;//int*
//	int* p2 = &arr[0];//int*
//	int(*p3)[10] = &arr;//int(*)[10] 数组指针类型
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
//	int(*p)[10] = &arr;
//	//p == &arr
//	//*p == *&arr == arr
//	//(*p)[i] == arr[i]
//
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//        printf("%d ", (*p)[i]);
//	}
//	//一般不会这么用，知道就好。
//
//	return 0;
//}


//数组指针一般是在二维数组传参的时候用的。
//void PrintArray(int arr[2][4], int rows, int cols)
//void PrintArray(int(*arr)[4], int rows, int cols)//int(*arr)[4] 指向数组第一行的地址
//{
//	int i = 0;
//	int j = 0;
//    for (i = 0; i < rows; i++)
//    {
//        //arr[i]
//        for (j = 0; j < cols; j++)
//        {
//            //*(arr + i) == arr[i]
//            //printf("%d ", arr[i][j]);
//            //arr[i][j] == (*(arr + i) + j)
//            printf("%d ", *(*(arr + i) + j));
//        }
//        printf("\n");
//    }
//    //printf("sizeof(arr) = %d\n", sizeof(arr));
//    //printf("sizeof(arr[1]) = %d\n", sizeof(arr[1]));
//    //printf("sizeof(arr[1][1]) = %d\n", sizeof(arr[1][1]));
//    //printf("arr = %p\n", arr);
//    //printf("arr+1 = %p\n", arr+1);
//    //printf("&arr = %p\n", &arr);
//}
//
//int main()
//{
//	int arr[2][4] = { 1,2,3,4,5,6,7,8 };
//	PrintArray(arr,2,4);
//    //arr是数组名，也表示数组首元素的地址。--> 一维数组的地址
//    //二维数组是一维数组的数组
//    //二维数组的元素是一维数组
//    //每一行就是一个元素
//    //二维数组的首元素是第一行
//
//	return 0;
//}